home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / e_os300b / ex_gif / gif.asm < prev    next >
Encoding:
Assembly Source File  |  1996-10-25  |  10.3 KB  |  374 lines

  1. ; '.-Gif LoaDer-.' E.O.S version    Loade tous les gifs de 4 à 256 couleurs
  2. ;
  3. ;                  ■ CoDeD By NaNaRd ■
  4. ;
  5. ;    Salut à toi, ô codeur, ce chargeur de Gif est à ton entière disposition
  6. ; utilise le dans tous tes programmes si tu le souhaite et améliore si tu le
  7. ; veux. (Ouf! ce fut une phrase difficile à sortir:-)
  8.  
  9. Locals
  10. .386
  11. CODE32 SEGMENT PUBLIC PARA 'CODE' USE32
  12. ASSUME  CS:CODE32,DS:CODE32,ES:CODE32
  13. INCLUDE ..\RESOURCE\EOS.INC
  14.  
  15. Gifname        db 'eclipse.gif',0    ;les datas spécifiques au loader sont
  16.                     ;à la fin de ce fichier.
  17. start32:
  18.     mov edx,O Gifname
  19.     call gif_load
  20.     mov ax,13h    ;mode MCGA 320x200x8bits
  21.     dosint 10h
  22.     call sendpal
  23.     mov esi,[raw_buff]
  24.     mov edi,[_0a0000h]
  25.     mov ecx,64000/4
  26.     rep movsd
  27.     xor eax,eax
  28.     dosint 16h    ;wait a key
  29.         mov ax,4c00h
  30.         int 21h
  31.  
  32.  
  33. ;------------------------- Procédure gif_load ---------------------------------
  34. ;╔════════════════════════════════════════════════════════════════════════════╗
  35. ;║                                          ║
  36. ;║    Entrée :                                  ║
  37. ;║            EDX : Offset du nom du fichier Gif              ║
  38. ;║            DS et ES : [Data32_Sel]                   ║
  39. ;║                                          ║
  40. ;║    Sortie :                                  ║
  41. ;║            [Raw_Buff] :      Offset de l'image décompressée          ║
  42. ;║                    à utiliser avec Data32_Sel          ║
  43. ;║            [Raw_Buff0] :      Offset de l'image décompressée          ║
  44. ;║                    à utiliser avec Zero_Sel          ║
  45. ;║            w[Xsize] et w[Ysize] : Largeur et hauteur de l'image  ║
  46. ;║            palette[768] : palette en 6bits prête pour sendpal    ║
  47. ;║            b[interlaced] : -1 si le gif est entrelacé, 0 sinon.  ║
  48. ;║                                          ║
  49. ;║      Tous Les registres sont succeptibles d'avoir changé de valeur,      ║
  50. ;║    sauf les registres de segment et EBP.                      ║
  51. ;║      Attention ! Je ne gère pas les erreurs (mauvais fichier, etc...)    ║
  52. ;║    C'est à vous de vous en occuper. Tout sera impecable dans une          ║
  53. ;║    prochaine version. Je vous conseille de mater mon code de toute façon ║
  54. ;║                                          ║
  55. ;╚════════════════════════════════════════════════════════════════════════════╝
  56. gif_load proc
  57.     mov ah,load_external_file    ;à changer pour internal, mais llink ne
  58.                 ;veut pas des gif tels quels (non dietisés).
  59.     int_eos            ; Sortie de cette fction :
  60.     mov esi,eax        ;esi=adresse physique, eax=adresse dans Data32
  61.  
  62.     cmp d [esi],"8FIG"        ;'GIF8'    J'verifie si C bien 1 Gif
  63.     jnz abandon
  64. ;lecture du nombre de bits/pixels
  65.     mov cl,[esi+10]    ;indicateur de résolution
  66.     add esi,13
  67.         and ecx,0111b    ;seulement les 3  derniers bits
  68.         inc ecx
  69.         mov b imgbits,cl
  70.         mov eax,1
  71.         shl eax,cl
  72.         mov w ncolors,ax
  73.         mov ecx,eax      ;=palette
  74.     add ecx,eax
  75.     add ecx,eax
  76.         call shiftpal
  77. extloop:
  78.     cmp b [esi],21h        ;"!":signature des blocks d'extension
  79.         jne noext
  80.     add esi,2
  81.     xor ecx,ecx
  82.     mov cl,b [esi]
  83. ;aplic:
  84.     add esi,ecx
  85.     inc esi
  86.     mov cl,b[esi]
  87. aplic2:
  88.     or cl,cl
  89.     je aplicfin
  90.     add esi,ecx
  91.     inc esi
  92.     mov cl,b [esi]
  93.     jmp aplic2
  94. aplicfin:
  95.     inc esi
  96.     jmp extloop
  97. noext:
  98.     inc esi
  99.     mov eax,d [esi+4]
  100.     mov ecx,d [esi+6]
  101.         mov w xsize,ax
  102.         mov w ysize,cx
  103. ;lecture du nbre de bits/pix
  104.     mov cl,b [esi+8]
  105.         xor eax,eax
  106.         test cl,64      ;image entrelacée?
  107.         jz nointerlaced
  108.         not eax
  109. nointerlaced:
  110.     add esi,9
  111.         mov b interlaced,al
  112.         test cl,128      ;palette locale?
  113.         je noloc
  114.         and ecx,0111b
  115.         inc ecx
  116.         mov b imgbits,cl
  117.         mov eax,1
  118.         shl eax,cl
  119.         mov w ncolors,ax
  120.         mov ecx,eax
  121.     add ecx,eax
  122.     add ecx,eax
  123.         call shiftpal
  124.  
  125. noloc:        ;initialisation des differentes variables.
  126.     inc esi        ;on saute le nbits
  127.         xor     ebx,ebx
  128.         mov     w lbyte,bx       ;pas de dernier code lu
  129.     mov    ax,w ncolors
  130.     mov    w clr,ax    ;code clear= ncolors
  131.     inc    eax
  132.     mov    w eof,ax    ;code eof= ncolors + 1
  133.     inc    eax
  134.     mov    w free,ax    ;ncolors + 2 = 1ère entrée libre
  135.     mov    w freesav,ax
  136.         add     cl,b imgbits
  137.     inc     ecx
  138.         mov     b nbbit,cl    ;au départ, nbbits= imgbits + 1
  139.         mov    b nbbitsav,cl
  140.     mov     eax,1
  141.         shl     eax,cl
  142.         dec     eax
  143.         mov     w max,ax    ;max = 2^nbbits - 1
  144.         mov    w maxsav,ax
  145.         mov     d stackp,ebx
  146.         mov     d restbits,ebx
  147.         mov     d restbyte,ebx
  148.  
  149. goon:
  150.     movzx eax,xsize
  151.     movzx ecx,ysize
  152.     mul ecx
  153.     xchg edx,eax    ;taille
  154.     mov ah,Allocate_Memory
  155.     int_eos
  156.     jc not_enough_ram
  157.     mov [raw_buff0],eax
  158.     mov [raw_buff],edx
  159.     mov edi,edx
  160.  
  161. mainloop: ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  162.         call getlogbyte
  163.         cmp ax,w eof    ;fin du fichier
  164.         je abandon
  165.         cmp ax,w clr    ;nouvel alphabet
  166.         je clear
  167.         mov w readbyt,ax
  168.         cmp ax,w free
  169.         jb code_in_ab   ;jmp si code dans ab
  170.         mov ax,w old_code
  171.         mov w act_code,ax
  172.         mov ebx,d stackp
  173.         mov cx,w casspecial
  174.         mov w abstack[ebx],cx
  175.         inc d stackp
  176. code_in_ab:
  177.         cmp ax,w clr
  178.         jb  concret
  179. fillstack_loop:
  180.   movzx ebx,w act_code             ;le code est un pointeur dans l'alphabet
  181.   add ebx,ebx                    ;Word Array (!)
  182.   push ebx
  183.   mov eax,d ab_suffx[ebx]         ;cherche le suffixe, qui est concret
  184.   mov ebx,d stackp               ;le place sur la pile
  185.   add ebx,ebx                    ;considérée comme Word Array
  186.   mov w abstack[ebx],ax
  187.   inc d stackp
  188.   pop ebx
  189.   mov eax,d ab_prfx[ebx]          ;cherche le préfixe
  190.   mov w act_code,ax             ;le prend comme code courant
  191.   cmp ax,w clr
  192.         ja fillstack_loop
  193. concret:
  194.   mov ebx,d stackp               ;empile le dernier code
  195.   add ebx,ebx                   ;comme Word Array
  196.   mov w abstack[ebx],ax
  197.   mov w casspecial,ax           ;en prend note aussi pour le cas spécial 
  198.   inc d stackp                  ;fait progresser le pointeur
  199.   mov ebx,d stackp               ;prépare la lecture de la pile
  200. mov ecx,ebx
  201.   dec ebx                        ;décrémente le pointeur
  202.   add ebx,ebx                  ;sur Word Array 
  203. readstack_loop:
  204.   mov al,b abstack[ebx]          ;prend un caractère
  205.    sub ebx,2                     ;pointeur de pile sur l'élément suivant
  206.   stosb
  207. loop readstack_loop    ;loop=rame sur 486 mais speede sur 6x86
  208.   mov d stackp,ecx              ;réinitialise le pointeur de pile (ecx=0)
  209.   movzx ebx,w free              ;met à jour l'alphabet
  210.   add ebx,ebx                   ;à la position "free" 
  211.   mov ax,w old_code             ;écrit le dernier code dans préfixe
  212.   mov w ab_prfx[ebx],ax
  213.   mov ax,w act_code             ;et le code courant dans suffixe
  214.   mov w ab_suffx[ebx],ax
  215.   mov ax,w readbyt              ;le code  lu est le plus récent
  216.   mov w old_code,ax
  217.   inc w free
  218.   inc eax
  219.   mov ax,w free
  220.   cmp ax,w max
  221.   jna mainloop
  222.   cmp b nbbit,12                ;nombre de bits déjà égal à 12 ?
  223.   jnb mainloop
  224.   inc b nbbit                   ;sinon on l'augmente
  225.   mov eax,1                     ;1 décalé de nbbit vers la gauche
  226.   mov cl,b nbbit                ;nouveau maximum d'entrées
  227.   shl eax,cl
  228.   dec eax                       ;puis décrémenté
  229.   mov w max,ax                  ;enregistre le maximum 
  230.   jmp mainloop
  231.  
  232. clear:
  233.     mov ax,w freesav
  234.     mov w free,ax
  235.     mov al,b nbbitsav
  236.     mov b nbbit,al
  237.     mov ax,w maxsav
  238.     mov w max,ax
  239.         call getlogbyte
  240.         mov w casspecial,ax
  241.         mov w old_code,ax
  242.     stosb
  243.         jmp mainloop
  244.  
  245. abandon:
  246.     ret
  247. not_enough_ram:
  248.     mov ah,exit_error
  249.     mov edx,O ram_err
  250.     int_eos
  251. endp
  252. ;------------------------------ procédures -----------------------------------
  253.  
  254. shiftpal proc near
  255.         mov edi,offset palette
  256.         shr ecx,2
  257. @l1:
  258.         lodsd
  259.         shr eax,2
  260.         stosd
  261.         dec ecx
  262.         jnz @l1
  263.         ret
  264. endp
  265.  
  266. sendpal proc near    ;envoie automatiquement la palette dans la VGA.
  267.     movzx ecx,w ncolors    ;Ne Fait pas vraiment partie du loader
  268.     mov eax,ecx
  269.     add ecx,ecx
  270.     mov dx,3c8h
  271.     add ecx,eax
  272.     xor eax,eax
  273.     out dx,al
  274.     inc edx
  275.     mov esi,offset palette
  276.     rep outsb    ;à changer car certaines cartes n'apprecient pas
  277.     ret        ;(on le dit mais j'en ai jamais vu!)
  278. endp
  279.  
  280. getphysbyte proc near   ;destroy ebx
  281.     xor eax,eax
  282.         cmp d restbyte,0
  283.         ja @yadurab
  284.     lodsb        ;longueur du data block
  285.     mov d restbyte,eax
  286. @yadurab:
  287.     dec d restbyte
  288.     lodsb
  289.     ret
  290. endp
  291.  
  292. getlogbyte proc near
  293.     mov dh,b nbbit
  294.     mov dl,b restbits
  295.     mov cl,8
  296.         sub cl,dl
  297.         movzx eax,w lbyte    ;pour garder les restbits interressants
  298.         shr eax,cl    ;décale lbyte de 8-restbits vers la droite
  299.         mov w act_code,ax
  300.         cmp dh,dl
  301.         ja  @glbsuite
  302.     mov cl,dh
  303.     mov ebx,1
  304.     shl ebx,cl
  305.         dec ebx
  306.         and eax,ebx
  307.         sub dl,dh
  308.         mov b restbits,dl
  309.     mov w act_code,ax
  310.         ret
  311. @glbsuite:        ;si il faut lire au moins un byte physique
  312.         sub dh,dl    ;soustraire les restbits déja lus
  313. @nextbyte:
  314.         call getphysbyte
  315.         mov w lbyte,ax
  316.         mov ebx,1
  317.         mov cl,dh
  318.         shl ebx,cl
  319.         dec ebx
  320.     and eax,ebx
  321.         mov cl,dl
  322.         shl eax,cl
  323.         add w act_code,ax    ;important de rester en word!
  324.         sbb dl,b nbbit
  325.         add dl,8
  326.         jns @positif
  327.         add dl,8
  328. @positif:
  329.         sub dh,8
  330.         jle @fini
  331.         add dl,b nbbit
  332.         sub dl,8
  333.         jmp @nextbyte
  334. @fini:
  335.         mov b restbits,dl
  336.         mov ax,w act_code
  337.         ret
  338. endp
  339.  
  340. ;---------------------------- datas -------------------------------------------
  341. ram_err        db '     ■ Not enough room to uncompress gif.$'
  342. align 2    ;needed? I'm not a king of Pentium optimization...
  343. raw_buff    dd ?    ;addresse du buffer de destination dans Data32_sel
  344. raw_buff0    dd ?    ;addresse du buffer de destination dans Zero_Sel
  345. palette        db 768    dup (?)    ;palette déja shiftée a la fin....
  346. buffind         dd ?
  347. abstack         db 1282 dup (?)
  348. ab_prfx         dw 4096 dup (?)
  349. ab_suffx        dw 4096 dup (?)
  350. free            dw ?
  351. freesav         dw ?
  352. nbbit           db ?
  353. nbbitsav        db ?
  354. max             dw ?
  355. maxsav          dw ?
  356. stackp          dd ?
  357. restbits        dd ?
  358. restbyte        dd ?
  359. casspecial      dw ?
  360. act_code        dw ?
  361. old_code        dw ?
  362. readbyt         dw ?
  363. lbyte           dw ?
  364. clr             dw ?    ;code clear
  365. eof             dw ?    ;code 'end of file'
  366. ncolors         dw ?
  367. xsize           dw ?    ;devinez
  368. ysize           dw ?    ; ! ! !
  369. interlaced      db ?
  370. imgbits         db ?    ;nombre de bits de l'image (de 2 à 8)
  371.             ; Toutefois, dans le buffer de destination,
  372. code32 ends        ; Chaque pixel = un octet
  373. end
  374.